package com.ruoyi.web.controller.common;

import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.baidu.BaiduOcrUtil;
import com.ruoyi.common.config.CloudConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BaiduOcrParamEnum;
import com.ruoyi.common.model.vo.FileInfoVo;
import com.ruoyi.common.model.vo.SimpleRestVo;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Map;

/**
 * 文件上传服务
 *
 * @author liaowen
 * @date 2024/11/6 16:41
 */
@RestController
@RequestMapping("/wwq/cloud/upload")
public class CloudUploadController extends BaseController {

    @Autowired
    private CloudConfig cloudConfig;
    @Autowired
    private BaiduOcrUtil baiduOcrUtil;

    /**
     * 通用上传请求（单个）
     */
    @PostMapping("/uploadFile")
    public SimpleRestVo uploadFile(MultipartFile file) {
        try {
            // 上传文件路径
            String filePath = cloudConfig.getBaseDir();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.uploadFile(filePath, file);
            String url = Constants.RESOURCE_PREFIX + fileName;
            FileInfoVo fileInfoVo = FileInfoVo.builder()
                    .fileName(fileName)
                    .fileUrl(url)
                    .newFileName(FileUtils.getName(fileName))
                    .originalFilename(file.getOriginalFilename())
                    .build();
            return SimpleRestVo.successVo(fileInfoVo);
        } catch (Exception e) {
            logger.error("上传文件失败: ", e);
            return SimpleRestVo.failedVo("上传文件失败");
        }
    }

    /**
     * 上传并识别图片文字（身份证、营业执照）
     *
     * @param file      图片文件
     * @param imageType 图片类型：1-身份证正面图，2-身份证反面图，3-营业执照
     */
    @PostMapping("/uploadRecognizeImage")
    public SimpleRestVo uploadRecognizeImageBaidu(MultipartFile file, Integer imageType) {
        try {
            BaiduOcrParamEnum baiduOcrParamEnum = BaiduOcrParamEnum.fromCode(imageType);
            if (ObjectUtil.isNull(baiduOcrParamEnum) || ObjectUtil.isNull(file)) {
                return SimpleRestVo.failedVo("参数类型不正确！");
            }

            // 校验图片类型
            String originalFilename = file.getOriginalFilename();
//            String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
//            List<String> allowPics = Arrays.asList("jpg", "jpeg", "png");
//            if (!allowPics.contains(ext)) {
//                return SimpleRestVo.failedVo("参数文件类型不正确！");
//            }
            // 调用识别
            File fileToFile = baiduOcrUtil.multipartFileToFile(file);
            Map<String, String> recognitionResult = baiduOcrUtil.getRecognitionResultBaidu(fileToFile, baiduOcrParamEnum);
            fileToFile.delete();
            if (ObjectUtil.isEmpty(recognitionResult)) {
                return SimpleRestVo.failedVo("上传文件识别失败");
            }
            fileToFile.delete();
            // 上传文件路径
            String filePath = cloudConfig.getBaseDir();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.uploadFile(filePath, file);
            String url = Constants.RESOURCE_PREFIX + fileName;
            FileInfoVo fileInfoVo = FileInfoVo.builder()
                    .fileName(fileName)
                    .fileUrl(url)
                    .newFileName(FileUtils.getName(fileName))
                    .originalFilename(originalFilename)
                    .recognitionResult(recognitionResult)
                    .build();

            return SimpleRestVo.successVo(fileInfoVo);
        } catch (Exception e) {
            return SimpleRestVo.failedVo("上传文件识别失败");
        }
    }

}
